package rs.pnv.pcc.handler;

import javax.xml.transform.Source;
import javax.xml.transform.dom.DOMSource;
import javax.xml.ws.handler.LogicalHandler;
import javax.xml.ws.handler.LogicalMessageContext;
import javax.xml.ws.handler.MessageContext;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

import rs.pnv.pcc.handler.crypto.SignEnveloped;
import rs.pnv.pcc.handler.crypto.VerifySignatureEnveloped;
import rs.pnv.util.DocumentUtil;

public class SignatureHandler implements LogicalHandler<LogicalMessageContext> {

	@Override
	public boolean handleMessage(LogicalMessageContext context) {

		System.out.println("SignatureHandler.handleMessage()");

		Boolean isResponse = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

		Source source = context.getMessage().getPayload();
		try {
			DocumentUtil.printSource(source);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		Document document = DocumentUtil.convertToDocument((DOMSource)source);

		if (isResponse) {
			System.out.println("potpisivanje...");
			
			/*
			Document signedDocument = SignEnveloped.signDocument(document);		
			Source signedSource = new DOMSource(signedDocument);
			context.getMessage().setPayload(signedSource);
			*/
			
			// ako je sve prošlo dobro, vrati true da pređeš na sledeći handler
			return true;

		} else {
			System.out.println("validacija i skidanje potpisa...");
			/*
			boolean signatureValid = VerifySignatureEnveloped.verifySignature(document);
			
			if(!signatureValid) {
				return false; // potpis nije validan
			}

			// uklanjanje potpisa
			Element element =  (Element) document.getElementsByTagNameNS("http://www.w3.org/2000/09/xmldsig#", "Signature").item(0);  
			element.getParentNode().removeChild(element);
			
			context.getMessage().setPayload(new DOMSource(document));
			 */
			// ako je sve prošlo dobro, vrati true da pređeš na sledeći handler
			return true;
		}

	}

	@Override
	public boolean handleFault(LogicalMessageContext context) {

		// ako vraća false, znači da NE treba da se pozove handleFault metoda od sledećeg handler-a.
		// dakle, vratiti true, ako POSTOJI greška.
		return true;
	}

	@Override
	public void close(MessageContext context) {

	}

}
